package com.chenjiaru.io;

import java.io.*;

/**
 * 1
 * 字节流操作
 *      1、适合操作二进制文件，文本文件也可以，但是遇到中文可能会乱码
 */
public class InputStreamDemo {

    public static void main(String [] arr) {
        copyBufferedInputStream("C:\\software\\ideaCode\\chenjiaru\\java\\src\\main\\resources\\a.txt", "C:\\software\\ideaCode\\chenjiaru\\java\\src\\main\\resources\\b.txt");

    }



    /**
     * 节点流
     * 使用 FileInputStream FileOutputStream 实现文件拷贝
     * @param src       原路径
     * @param desc      目标路径
     */
    public static void copyByFileInputStream(String src, String desc) {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream(src);
            fos = new FileOutputStream(desc);

            byte[] buff = new byte[1024];
            int len = -1;
            while ((len = fis.read(buff)) != -1) {
                System.out.println("准备写=" + len);
                fos.write(buff, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            close(fis);
            close(fos);
        }
    }

    /**
     * 处理流 BufferedInputStream（FileInputStream） BufferedOutputStream（FileOutputStream）
     *      1.只要关处理流就可以了，他会自动关对应的节点流，其他处理流也是这样的
     *      2.处理流和节点流的方法基本一致，但是内部实现了缓冲，提高了性能
     * @param src       原路径
     * @param desc      目标路径
     */
    public static void copyBufferedInputStream(String src, String desc) {
        FileInputStream fis = null;
        BufferedInputStream bis = null;
        FileOutputStream fos = null;
        BufferedOutputStream bos = null;
        try {
            fis = new FileInputStream(src);
            bis = new BufferedInputStream(fis);

            fos = new FileOutputStream(desc);
            bos = new BufferedOutputStream(fos);

            byte[] buff = new byte[1024];
            int len = -1;
            while ((len = bis.read(buff)) != -1) {
                System.out.println("准备写=" + len);
                bos.write(buff, 0, len);
            }
            // 最后一次，需要刷新此缓冲的输出流，保证数据全部都能写出
            bos.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            close(bis);
            close(bos);
        }
    }



    /**
     * 关闭输入流
     * @param inputStream
     */
    public static void close(InputStream inputStream) {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 关闭流OutStream
     * @param outputStream
     */
    public static void close(OutputStream outputStream) {
        if (outputStream != null) {
            try {
                outputStream.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }



}
